package com.data.basic.chapter10.leetcode;

import java.util.TreeMap;

/**
 * 实现一个 MapSum 类里的两个方法，insert 和 sum。
 * 对于方法 insert，你将得到一对（字符串，整数）的键值对。字符串表示键，整数表示值。如果键已经存在，那么原来的键值对将被替代成新的键值对。
 * 对于方法 sum，你将得到一个表示前缀的字符串，你需要返回所有以该前缀开头的键的值的总和。
 * 示例 1:
 * 输入: insert("apple", 3), 输出: Null
 * 输入: sum("ap"), 输出: 3
 * 输入: insert("app", 2), 输出: Null
 * 输入: sum("ap"), 输出: 5
 */
public class MapSum {
    private Node root;

    private class Node{
        private int value;
        private TreeMap<Character,Node> next;

        public Node(int value) {
            this.value = value;
            this.next = new TreeMap<>();
        }

        public Node() {
            this(0);
        }
    }

    /** Initialize your data structure here. */
    public MapSum() {

        root= new Node();
    }

    public void insert(String key, int val) {
        Node cur = root;
        for (int i=0;i<key.length();i++){
            char c = key.charAt(i);
            if (cur.next.get(c)==null){
                cur.next.put(c,new Node());
            }
            cur = cur.next.get(c);
        }
        //在最后一个字符加入value,将其视为权重
        cur.value = val;

    }

    public int sum(String prefix) {
        Node cur = root;
        for (int i=0;i<prefix.length();i++){
            char c = prefix.charAt(i);
            if (cur.next.get(c)==null){
                return 0;
            }
            cur = cur.next.get(c);
        }

        return sum(cur);

    }

    private int sum(Node node){
        int result = node.value;
        //求取所有子树的值
        for (char c:node.next.keySet()){
            result += sum(node.next.get(c));
        }
        return result;
    }
}